home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / gfx_card / fieldm11.lha / FieldMachine.oprx < prev    next >
Encoding:
Text File  |  1994-05-30  |  13.5 KB  |  590 lines

  1. /* The Field Machine v1.1              */
  2. /*                                     */
  3. /* ©1993 Carmen Rizzolo                */
  4.  
  5. Options Results
  6. Address 'OpalPaint_Rexx'
  7.  
  8. Version
  9. Parse Var Result VerThingy ' ' OpalName ' ' VersionNum ' ' DateNum
  10.  
  11. If Left(VersionNum,3) < 2.3 Then Do
  12.     AskBool 'It appears that you are using OpalPaint v' || VersionNum || '\n\nField-Machine requires OpalPaint v2.3 or higher\n\nShall I continue?'
  13.     If Result = 0 Then Do
  14.         Okay 'Exiting...'
  15.         Exit
  16.         End
  17.     End
  18.  
  19. If Exists('LIBS:rexxsupport.library') = 0 Then Do
  20.     Okay 'FATAL ERROR!  You are missing the rexxsupport.library\nfrom your LIBS: directory.  Check your Arexx\ninstallation.\n\nExiting...'
  21.     Exit
  22.     End
  23. Call ADDLIB('rexxsupport.library',0,-30,0)
  24.  
  25. Iff = 0
  26. Iff2 = 0
  27. DeleteBool = 0
  28. PALBool = 0
  29.  
  30. Call CheckSparePages()
  31. Call CheckForSten()
  32. Menu DISABLE
  33. Call ConfirmFieldMachine()
  34.  
  35. /* Turn off Brush Outlines */
  36. Call NoOutlines()
  37. Call GetDefaultPath()
  38. Call GetAnimPath()
  39. Call WriteDefaultpath()
  40. Call MakeDestPath()
  41. Call GetFrameNumbers()
  42. Call GetFieldMode()
  43.  
  44. Okay 'Here we go.'
  45.  
  46. A = StartFrame
  47. Call GetTokens()
  48.  
  49. Do Forever
  50.     B = (A * 2) + 1
  51.     If A = EndFrame Then Leave
  52.     Call GetIFF()
  53.  
  54.     Call Panic()
  55.     Call LookForFieldA()
  56.     Call LoadFieldA()
  57.     Call ResizeAndStampImage()
  58.     Call Panic()
  59.  
  60.     Call AddSparePage()
  61.     Call Panic()
  62.     Call LookForFieldB()
  63.     Call LoadFieldB()
  64.     Call ResizeAndStampImage()
  65.     Call Panic()
  66.  
  67.     Call GoToFirstPage()
  68.  
  69. /* SetUp Stencil for First Page        */
  70.     Call Panic()
  71.     Call LoadStencil()
  72.  
  73. /* Enable RubThrough                   */
  74.     Call Rub()
  75.     Call SaveImage()
  76.  
  77.     A = A + 1
  78.     End
  79.  
  80. Address Command
  81. 'Delete Ram:FieldMachine.Brush Quiet'
  82. Address 'OpalPaint_Rexx'
  83.  
  84. Okay 'Operation Complete'
  85. Exit
  86.  
  87.  
  88. CheckSparePages:
  89.     Address 'OpalPaint_Rexx'
  90.     PickPage 1
  91.     OpenPages
  92.     NumPages = Result
  93.     If NumPages ~= 1 Then Do
  94.         Okay 'FATAL ERROR:\nThis script must not be run when OpalPaint has more than one page open.\nSave all your pages and delete them so I can start with one page.\n\nExiting...'
  95.         Exit
  96.         End
  97.     Return
  98.  
  99. CheckForSten:
  100.     Address 'OpalPaint_Rexx'
  101.     Finder = Exists('Images24:Stencils/FieldMachine.Sten')
  102.     If Finder = 0 Then Do
  103.         Okay 'FATAL ERROR:  I cannot find the FieldMachine.Sten file in your\nImages24:Stencils directory.  Please properly install\nthe Field Machine before running it!.'
  104.         Okay 'Exiting...'
  105.         Exit
  106.         End
  107.     Return
  108.  
  109. ConfirmFieldMachine:
  110.     Address 'OpalPaint_Rexx'
  111.  
  112.     ReqBuild '420 130 " "'
  113.     AddBox '10 10 400 110'
  114.     AddBox '15 15 5 5 Raised'
  115.     AddBox '-20 15 5 5 Raised'
  116.     AddBox '15 -20 5 5 Raised'
  117.     AddBox '-20 -20 5 5 Raised'
  118.     AddBox '47 -53 109 31'
  119.     AddBox '-153 -53 106 31'
  120.     AddHeading 'CenterX 20 "Field Machine v1.1"'
  121.     AddHeading 'CenterX 35 "an Arexx script for OpalPaint v2.3 or higher"'
  122.     AddHeading 'CenterX 45 "by Carmen Rizzolo"'
  123.  
  124.     AddGadget 'Button NTSCButton 50 -25 Small "NTSC"'
  125.     AddGadget 'Button PALButton 103 -25 Small "PAL"'
  126.     AddGadget 'Button NoButton -50 -25 Medium "Quit"'
  127.  
  128.     Request NoOK NoCancel
  129.  
  130.     GadgetStatus NTSCButton
  131.     If Result = 1 Then PALBool = 0
  132.  
  133.     GadgetStatus PALButton
  134.     If Result = 1 Then PALBool = 1
  135.  
  136.     GadgetStatus NoButton
  137.     If Result = 1 Then Do
  138.         Exit
  139.         End
  140.     Return PALBool
  141.  
  142. NoOutlines:
  143.     Address 'OpalPaint_Rexx'
  144.     GetPrefs
  145.     Prefs = Result
  146.     If (Prefs//2048)<1024 Then Do
  147.         NewPrefs=Prefs+1024
  148.         SetPrefs NewPrefs
  149.         End
  150.     Return
  151.  
  152. GetDefaultPath:
  153.     Address 'OpalPaint_Rexx'
  154.     If Open('DefaultFile','OpalPaint:Rexx/FieldMachineDefault.TXT','r') = 1 Then Do
  155.         AnimPathDefault = ReadLn('DefaultFile')
  156.         Chucky = Close('DefaultFile')
  157.         End
  158.     Else Do
  159.         AnimPathDefault = 'Imagine:FieldAnim.imp/a.pix/'
  160.         End
  161.     Return AnimPathDefault
  162.  
  163. GetAnimPath:
  164.     Address 'OpalPaint_Rexx'
  165.     PathWarn = 1
  166.  
  167.     Do Forever
  168.         LeaveBool = 1
  169.         ReqBuild '450 161 "Choose animation pathname"'
  170.         AddBox '10 23 430 105'
  171.         AddText 'CenterX 29 "NOTE: Pathnames must end with a / character"'
  172.  
  173.         AddText 'CenterX 50 "Pathname"'
  174.         AddGadget 'String ReqAnimPathName CenterX 60 Large'
  175.         AddGadget 'Button SourceReq 25 60 80 20 " "'
  176.         AddBox '22 57 86 26'
  177.         AddHeading '29 67 "REQUESTOR"'
  178.  
  179.         AddGadget 'Button OKButton CenterX -5 Medium "Proceed"'
  180.  
  181.         InitGadget 'ReqAnimPathName ' || AnimPathDefault
  182.  
  183.         Request NoOK NoCancel
  184.  
  185.         GadgetStatus ReqAnimPathName
  186.         AnimPathName = Result
  187.  
  188.         GadgetStatus SourceReq
  189.         If Result = 1 Then Do
  190.             If PathWarn = 1 Then Do
  191.                 ReqBuild '369 76 " "'
  192.                 AddBox '5 5 358 65'
  193.                 AddText 'CenterX 10 "NOTE: You are about to use a file requestor"'
  194.                 AddText 'CenterX 20 "to choose a PATHNAME.  Do not select any"'
  195.                 AddText 'CenterX 30 "filenames.  Get the pathname only!"'
  196.                 AddGadget 'Button Okeedoke CenterX 40 Medium "Proceed"'
  197.                 Request NoOK NoCancel
  198.                 PathWarn = 0
  199.                 End
  200.             AskFileName 'Get SOURCE animation PATHNAME' "OpalPaint:" ''
  201.             AnimPathName = Result
  202.             End
  203.  
  204.         If Right(AnimPathName,1) ~= '/' Then AnimPathName = AnimPathName || '/'
  205.  
  206.         AnimPathDefault = AnimPathName
  207.  
  208.         Finder = Exists(AnimPathName)
  209.         If Finder = 1 Then Leave
  210.         If Finder = 0 Then Okay 'ERROR: Drawer not found!  Try agian...'
  211.         End
  212.  
  213.     Return AnimPathName
  214.  
  215. WriteDefaultPath:
  216.     Address 'OpalPaint_Rexx'
  217.     Call Open('DefaultWrite','OpalPaint:Rexx/FieldMachineDefault.TXT','w')
  218.     Call WriteLn('DefaultWrite',AnimPathName)
  219.     Call Close('DefaultWrite')
  220.     Return
  221.  
  222. MakeDestPath:
  223.     Address 'OpalPaint_Rexx'
  224.     Finder = Exists(AnimPathName || 'Field/')
  225.     If Finder = 0 Then Do
  226.         Address Command
  227.         'MakeDir ' || AnimPathName || 'Field'
  228.         Address 'OpalPaint_Rexx'
  229.         End
  230.     Return
  231.  
  232. GetFrameNumbers:
  233.     Address 'OpalPaint_Rexx'
  234.     LeaveBool = 1
  235.     StartDefault = 1
  236.     EndDefault = 2
  237.     Do Forever
  238.  
  239.         ReqBuild '320 160 "Frame numbers"'
  240.         AddBox '5 25 309 102'
  241.  
  242.         AddText 'CenterX 35 "Enter First Frame number as"'
  243.         AddText 'CenterX 45 "a normal ODD number."'
  244.         AddGadget 'Integer StartGad CenterX 55 35 16'
  245.  
  246.         AddText 'CenterX 80 "Enter Last Frame number as"'
  247.         AddText 'CenterX 90 "a normal EVEN number."'
  248.         AddGadget 'Integer EndGad CenterX 100 35 16'
  249.  
  250.         AddGadget 'Button OkayGad CenterX -5 Medium "Proceed"'
  251.  
  252.         InitGadget 'StartGad ' || StartDefault
  253.         InitGadget 'EndGad ' || EndDefault
  254.         Request NoOK NoCancel
  255.  
  256.         GadgetStatus StartGad
  257.         StartFrame = Result
  258.  
  259.         GadgetStatus EndGad
  260.         EndFrame = Result
  261.  
  262. /* Convert Starting Frame number to    */
  263. /* an odd number if need be            */
  264.  
  265.         If StartFrame/2 = StartFrame%2 Then Do
  266.             StartFrame = StartFrame + 1
  267.  
  268.             ReqBuild '320 135 "Warning!"'
  269.             AddBox 5 25 309 77
  270.             AddText 'CenterX 35 "Starting frame MUST be an odd number!"'
  271.  
  272.             AddGadget 'Check YesGad 20 49 Medium'
  273.             AddText 'Right YesGad 5 6 "Oops, I meant ' || StartFrame || '."'
  274.             AddGadget 'Check NoGad Below YesGad 0 1 Medium'
  275.             AddText 'Right NoGad 5 6 "Try Again"'
  276.  
  277.             AddGadget 'Button ProceedGad CenterX -5 Medium "Proceed"'
  278.  
  279.             InitGadget 'YesGad 1'
  280.             MutualEx 'YesGad NoGad'
  281.             Request NoOK NoCancel
  282.  
  283.             GadgetStatus NoGad
  284.             If Result = 1 Then LeaveBool = 0
  285.             End
  286.  
  287. /* Check to make sure Ending Number is */
  288. /* higher than Starting Number         */
  289.  
  290.         If EndFrame <= StartFrame Then Do
  291.             Okay 'FATAL ERROR!  Ending number must be higher than the starting number.\nConsult the documentation!  Exiting...'
  292.             Exit
  293.             End
  294.  
  295. /* Check to see if Ending number is an */
  296. /* even number                         */
  297.  
  298.         If EndFrame/2 ~= EndFrame%2 Then Do
  299.             EndFrame = EndFrame + 1
  300.             ReqBuild '320 135 "Warning!"'
  301.             AddBox 5 25 309 77
  302.             AddText 'CenterX 35 "Ending frame MUST be an even number!"'
  303.  
  304.             AddGadget 'Check YesGad 20 49 Medium'
  305.             AddText 'Right YesGad 5 6 "Oops, I meant ' || EndFrame || '."'
  306.             AddGadget 'Check NoGad Below YesGad 0 1 Medium'
  307.             AddText 'Right NoGad 5 6 "Try Again"'
  308.  
  309.             AddGadget 'Button ProceedGad CenterX -5 Medium "Proceed"'
  310.  
  311.             InitGadget 'YesGad 1'
  312.             MutualEx 'YesGad NoGad'
  313.             Request NoOK NoCancel
  314.  
  315.             GadgetStatus NoGad
  316.             If Result = 1 Then LeaveBool = 0
  317.  
  318.             End
  319.     If LeaveBool = 1 Then Leave
  320.     StartDefault = StartFrame
  321.     EndDefault = EndFrame
  322.     End
  323.  
  324. /* Process StartFrame and EndFrame     */
  325.  
  326.     StartFrame = (StartFrame - 1) / 2
  327.     EndFrame = EndFrame / 2
  328.  
  329.     Return StartFrame EndFrame
  330.  
  331. GetFieldMode:
  332.     Address 'OpalPaint_Rexx'
  333.     ReqBuild '340 222 "Field Conversion Options"'
  334.  
  335.     AddBox '5 25 329 60'
  336.     AddText 'CenterX 35 "Choose destination resolution of frames"'
  337.     AddGadget 'Cycle ResChangeModeGad 65 55 100 20 " Crop to" "Scale to"'
  338.  
  339.     If PALBool = 0 Then AddGadget 'Cycle ResGad 185 55 90 20 736x476 640x400 368x236 320x200 160x100'
  340.     If PALBool = 1 Then AddGadget 'Cycle ResGad 185 55 90 20 736x576 640x512 368x286 320x256 160x128'
  341.  
  342.     AddBox '5 89 329 62'
  343.     AddGadget 'Check FullHeight 30 100 Medium'
  344.     AddText 'Right FullHeight 5 6 "Retain full height of field."'
  345.  
  346.     AddGadget 'Check HalfHeight Below FullHeight 0 1 Medium'
  347.     AddText 'Right HalfHeight 5 6 "Compress fields to half height."'
  348.  
  349.     AddBox '5 155 329 34'
  350.     AddGadget 'Check DeleteGad 30 162 Medium'
  351.     AddText 'Right DeleteGad 5 6 "Delete original fields."'
  352.  
  353.     AddGadget 'Button OkayButton CenterX -5 Medium "Proceed"'
  354.  
  355.     InitGadget 'FullHeight 1'
  356.     MutualEx 'FullHeight HalfHeight'
  357.     Request NoOK NoCancel
  358.  
  359.     GadgetStatus ResChangeModeGad
  360.     If Result = ' Crop to' Then ResChangeMode = 0
  361.     If Result = 'Scale to' Then ResChangeMode = 1
  362.  
  363.     GadgetStatus ResGad
  364.     DestPageX = Left(Result,3)
  365.     DestPageY = Right(Result,3)
  366.  
  367.     GadgetStatus FullHeight
  368.     If Result = 1 Then ScaleBool = 0
  369.  
  370.     GadgetStatus HalfHeight
  371.     If Result = 1 Then ScaleBool = 1
  372.  
  373.     GadgetStatus DeleteGad
  374.     If Result = 1 Then DeleteBool = 1
  375.  
  376.     Return ResChangeMode DestPageX DestPageY ScaleBool DeleteBool
  377.  
  378. GetIff:
  379.     Address 'OpalPaint_Rexx'
  380.     Iff = 'pic.000' || B
  381.     If B < 10000 & B > 999 Then Iff = 'pic.' || B
  382.     If B < 1000 & B > 99 Then Iff = 'pic.0' || B
  383.     If B < 100 & B > 9  Then Iff = 'pic.00' || B
  384.  
  385.     Iff2 = 'pic.000' || (B + 1)
  386.     If (B + 1) < 10000 & (B + 1) > 999 Then Iff2 = 'pic.' || (B + 1)
  387.     If (B + 1) < 1000 & (B + 1) > 99 Then Iff2 = 'pic.0' || (B + 1)
  388.     If (B + 1) < 100 & (B + 1) > 9  Then Iff2 = 'pic.00' || (B + 1)
  389.  
  390.     Iff3 = 'pic.000' || A
  391.     If A < 10000 & A > 999 Then Iff3 = 'pic.' || A
  392.     If A < 1000 & A > 99 Then Iff3 = 'pic.0' || A
  393.     If A < 100 & A > 9  Then Iff3 = 'pic.00' || A
  394.  
  395.     Return Iff Iff2 Iff3
  396.  
  397. LookForFieldA:
  398.     Address 'OpalPaint_Rexx'
  399.     WaitCounter = 1
  400.     Do Forever
  401.         If Open('render',AnimPathName || IFF,'r') = 1 Then Do
  402.             Brad = Close('render')
  403.             Menu DISABLE
  404.             Address Command
  405.             'Copy ' || AnimPathName || IFF || ' Ram: Quiet'
  406.             Leave
  407.             End
  408.         Else Do
  409.             Address 'OpalPaint_Rexx'
  410.             Menu ENABLE
  411.             DisplayStatus 'Waiting ' || WaitCounter
  412.             WaitCounter = WaitCounter + 1
  413.             Call Delay(3000)
  414.             Address 'OpalPaint_Rexx'
  415.             End
  416.         End
  417.     Return
  418.  
  419. LoadFieldA:
  420.     Address 'OpalPaint_Rexx'
  421.     ActiveBrush 1
  422.     LoadBrush 'Ram:' || IFF
  423.     Address Command
  424.     'Delete ram:' || IFF || ' Quiet'
  425.     Address 'OpalPaint_Rexx'
  426.     Return
  427.  
  428. LookForFieldB:
  429.     Address 'OpalPaint_Rexx'
  430.     WaitCounter = 1
  431.     Do Forever
  432.         If Open('render',AnimPathName || IFF2,'r') = 1 Then Do
  433.             Brad = Close('render')
  434.             Menu DISABLE
  435.             Address Command
  436.             'Copy ' || AnimPathName || IFF2 || ' Ram: Quiet'
  437.             Leave
  438.             End
  439.         Else Do
  440.             Menu ENABLE
  441.             DisplayStatus 'Waiting ' || WaitCounter
  442.             WaitCounter = WaitCounter + 1
  443.             Delay 3000
  444.             Address 'OpalPaint_Rexx'
  445.             End
  446.         End
  447.     Return
  448.  
  449. LoadFieldB:
  450.     Address 'OpalPaint_Rexx'
  451.     ActiveBrush 1
  452.     LoadBrush 'Ram:' || IFF2
  453.     Address Command
  454.     'Delete ram:' || IFF2 || ' Quiet'
  455.     Address 'OpalPaint_Rexx'
  456.     Return
  457.  
  458. ResizeAndStampImage:
  459.     Address 'OpalPaint_Rexx'
  460.     ActiveBrush 1
  461.     BrushSize
  462.     Parse Var Result PageX PageY
  463.  
  464.     If Tokens ~= '' Then PageSize DestPageX DestPageY Tokens 0
  465.     If Tokens = '' Then PageSize DestPageX DestPageY 0
  466.  
  467.     Call Panic()
  468.     ActiveBrush 1
  469.  
  470.     If ScaleBool = 0 Then Do
  471.         If PageX ~= DestPageX | PageY ~= DestPageY Then Do
  472.             If ResChangeMode = 1 Then Do
  473.                 ReSize DestPageX DestPageY
  474.                 End
  475.             End
  476.         End
  477.  
  478.     If ScaleBool = 1 Then Do
  479.         If PageY ~= (DestPageY / 2) Then Do
  480.             If ResChangeMode = 1 Then Do
  481.                 RescaleMethod SMOOTH1
  482.                 Resize DestPageX (DestPageY / 2)
  483.                 RescaleMethod BLOCKY
  484.                 Resize DestPageX DestPageY
  485.                 End
  486.             If ResChangeMode = 0 Then Do
  487.                 RescaleMethod SMOOTH1
  488.                 Resize PageX (DestPageY / 2)
  489.                 RescaleMethod BLOCKY
  490.                 Resize PageX DestPageY
  491.                 End
  492.             End
  493.         If PageY = (DestPageY / 2) Then Do
  494.             If ResChangeMode = 1 Then Do
  495.                 If PageX > DestPageX | PageX < DestPageX Then Do
  496.                     RescaleMethod SMOOTH1
  497.                     Resize DestPageX PageY
  498.                     End
  499.                 End
  500.             RescaleMethod BLOCKY
  501.             Resize DestPageX DestPageY
  502.             End
  503.         End
  504.  
  505.     HandleCenter
  506.     PutBrush (DestPageX / 2) (DestPageY / 2)
  507.     Return
  508.  
  509. GetTokens:
  510.     Tokens = ''
  511.     Tokens2 = ''
  512.     If DestPageX = 736 Then Tokens = 'HIRES INTERLACE OVERSCAN'
  513.     If DestPageX = 640 Then Tokens = 'HIRES INTERLACE'
  514.     If DestPageX = 368 Then Tokens = 'OVERSCAN'
  515.     Return Tokens
  516.  
  517. Panic:
  518. /* Turn off all special functions            */
  519.     Address 'OpalPaint_Rexx'
  520.     Panic
  521.     DeleteSten
  522.     ExcludeAll DISABLE
  523.     EnableColEntry 1 DISABLE
  524.     EnableColEntry 2 DISABLE
  525.     EnableColEntry 3 DISABLE
  526.     EnableColEntry 4 DISABLE
  527.     EnableColEntry 5 DISABLE
  528.     EnableColEntry 6 DISABLE
  529.     StenEnable = 0
  530.     Trans Disable
  531.     SetDrawMode 1
  532.     ActiveNozzle 1
  533.     ResetATool
  534.     Texture = 0
  535.     AntiAlias DISABLE
  536.     Menu DISABLE
  537.     Return
  538.  
  539. AddSparePage:
  540.     Address 'OpalPaint_Rexx'
  541.     AddPage 736 476 HIRES INTERLACE OVERSCAN
  542.     PickPage 2
  543.     Return
  544.  
  545. GoToFirstPage:
  546.     Address 'OpalPaint_Rexx'
  547.     PickPage 1
  548.     SecondaryPage 2
  549.     Return
  550.  
  551. LoadStencil:
  552.     Address 'OpalPaint_Rexx'
  553.     Loader Intelligent
  554.     LoadComponents Stencil
  555.     Load 'Images24:Stencils/FieldMachine.Sten'
  556.     Refresh
  557.  
  558.     WorkMode IMAGE
  559.     'MaskSten Enable'
  560.     'StenEnable Enable'
  561.     Return
  562.  
  563. Rub:
  564.     Address 'OpalPaint_Rexx'
  565.     RubDirection 0
  566.     RubMode ABSOLUTE
  567.     TextureType RUBTHROUGH
  568.     'Texture  ENABLE'
  569.     Zap
  570.     Refresh
  571.     DeleteSten
  572.     Refresh
  573.     DeletePage 2
  574.     Return
  575.  
  576. SaveImage:
  577.     Address 'OpalPaint_Rexx'
  578.     Save 'Ram:' || Iff3
  579.     Address Command
  580.     'Copy Ram:' || IFF3 || ' ' || AnimPathName || 'Field Quiet'
  581.     'Delete Ram:' || IFF3 || ' Quiet'
  582.     If DeleteBool = 1 Then Do
  583.         Address Command
  584.         'Delete ' || AnimPathName || IFF || ' Quiet'
  585.         'Delete ' || AnimPathName || IFF2 || ' Quiet'
  586.         Address 'OpalPaint_Rexx'
  587.         End
  588.     Address 'OpalPaint_Rexx'
  589.     Return
  590.